package com.heboan.code2;

import java.util.Scanner;


public class Chress {
    static char[][] chess=new char[17][17];
    static char BLACK = '●';
    static char WHITE = '○';


    //自定义方法--往棋盘填充棋盘内容
    public static void fillChess(){
        char[] c={' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
        for(int i=0;i<chess.length;i++){
            for(int j=0;j<chess[i].length;j++){
                chess[i][j]='+';
            }
        }

        for(int m=0;m<c.length;m++){
            chess[m][0]=chess[0][m]=c[m];
        }

    }
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        fillChess();
        printChess();
        boolean flag=true;
        //flag表示控制和白方的开关，设定flag的值为true，控制黑方落子
        //设定flag的值为false，控制白方落子
        while(true){
            if(flag){//控制黑方落子
                //黑方落子
                System.out.println("请黑方落子：");
                //调用方法实现黑方从控制台输入
                String strBlack=sc.next();
                System.out.println("黑方输入的内容为："+strBlack);
                //charAt(下标）根据下标将字符串拆分成为字符
                /*
                 * "abcdef"
                 * 下标   012345 charAt（2）--》'c'
                 * 将黑方输入的内容拆分“35”    “af”
                 */
                char cB1=strBlack.charAt(0);
                char cB2=strBlack.charAt(1);
                boolean hasChess=isHaveChess(cB1,cB2);
                if(hasChess){
                    System.out.println("该位置上已经有棋子了，请重新输入");
                    flag=true;
                }else{
                    updateBlackChess(cB1,cB2);
                    printChess();
                    if(isWin(Chress.BLACK)){
                        System.out.println("恭喜你，黑方胜利！");
                        break;//结束循环
                    }
                    flag=false;
                }
            }
            if(!flag){//控制白方落子
                System.out.println("请白方落子：");
                String strWhite=sc.next();
                System.out.println("白方输入的内容为："+strWhite);
                //charAt(下标）根据下标将字符串拆分成为字符
                /*
                 * "abcdef"
                 * 下标   012345 charAt（2）--》'c'
                 * 将黑方输入的内容拆分“35”    “af”
                 */
                char cW1=strWhite.charAt(0);
                char cW2=strWhite.charAt(1);
                boolean hasChess =isHaveChess(cW1,cW2);
                if(hasChess){
                    System.out.println("该位置上已经有棋子了，请重新输入");
                    flag=false;
                }else{
                    updateWhiteChess(cW1,cW2);
                    printChess();
                    if(isWin(Chress.WHITE)){
                        System.out.println("恭喜你，白方胜利！");
                        break;//结束循环
                    }
                    flag=true;
                }
            }
        }
    }


    // 打印棋盘
    public static void printChess(){
        for(int i=0;i<chess.length;i++){
            for(int j=0;j<chess[i].length;j++){
                System.out.print(chess[i][j]+" ");
            }
            System.out.println();
        }
    }

    //参数：c1和c2表示控制台输入的行和列
    public static void updateBlackChess(char c1,char c2){
        chess[findLocation(c1,c2)[0]][findLocation(c1,c2)[1]]=Chress.BLACK;
    }
    public static void updateWhiteChess(char c1,char c2){
        chess[findLocation(c1,c2)[0]][findLocation(c1,c2)[1]]=Chress.WHITE;
    }
    public static int[] findLocation(char c1,char c2){
        int[] loc=new int[2];
        int x=0,y=0;//变量x和y表示根据输入的行和列找到的行下标和列下标
        char[] cr={' ','0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
        for(int i=0;i<cr.length;i++){
            if(cr[i]==c1){
                x=i;
            }
            if(cr[i]==c2){
                y=i;
            }
        }
        loc[0]=x;
        loc[1]=y;//将存有行列下标的数组返回
        return loc;
    }


    //判断该位置上是否有棋子
    public static boolean isHaveChess(char c1,char c2){
        int[] loc=findLocation(c1,c2);
        int x=loc[0];
        int y=loc[1];
        //x和y是找到的行下标和列下标
        if(chess[x][y]=='+'){
            return false;
        }else{
            return true;
        }
    }

    // 判断是否胜利
    public static boolean isWin(char c){
        //横向是否有连续5个
        for(int i=1;i<chess.length;i++){
            //i表示行，取值为1-16
            for(int j=1;j<chess[i].length-4;j++){
                if(chess[i][j]==c &&chess[i][j+1]==c &&chess[i][j+2]==c &&chess[i][j+3]==c &&chess[i][j+4]==c)
                    return true;
            }
        }
        //纵向是否有连续5个
        for(int j=1;j<chess[0].length;j++){
            for(int i=1;i<chess.length-4;i++){
                if(chess[i][j]==c &&chess[i+1][j]==c &&chess[i+2][j]==c &&chess[i+3][j]==c &&chess[i+4][j]==c)
                    return true;
            }
        }
        //正斜是否有连续5个
        for(int i=1;i<chess.length-4;i++){
            for(int j=5;j<chess[i].length;j++){
                if(chess[i][j]==c &&chess[i+1][j-1]==c &&chess[i+2][j-2]==c &&chess[i+3][j-3]==c &&chess[i+4][j-4]==c)
                    return true;
            }
        }
        //反斜是否有连续5个
        for(int i=1;i<chess.length-4;i++){
            for(int j=1;j<chess[i].length-4;j++){
                if(chess[i][j]==c&&chess[i+1][j+1]==c&&chess[i+2][j+2]==c &&chess[i+3][j+3]==c &&chess[i+4][j+4]==c)
                    return true;
            }
        }
        return false;
    }
}